home *** CD-ROM | disk | FTP | other *** search
- UNIT GrStuff; { Misc Graphic Functions, Last Updated Nov 11/93 }
- { Copyright (C), Greg Estabrooks, 1993 }
-
- INTERFACE
- (***********************************************************************)
-
- FUNCTION MonitorType :BYTE; { Determines Monitor In Use }
- PROCEDURE SetVidMode( Mode :BYTE ); { Set video mode }
- PROCEDURE SetPage( Page :BYTE ); { Set current screen page }
- PROCEDURE BiosPutPix( Col,Page :BYTE;X,Y :WORD ); { Plot pixel at X,Y }
- FUNCTION TSeng :BOOLEAN; { Determine if graph card a TSENG labs }
- FUNCTION GetVideoMode :BYTE;
- { Routine to determine current video mode }
- PROCEDURE Set80x30Mode;
- PROCEDURE DrawBar( X1,Y1,X2,Y2 :WORD; Color :BYTE );
- PROCEDURE SetColor( Color2Set, Red, Green, Blue :BYTE );
- PROCEDURE GetColor( Color2Get :BYTE; VAR Red,Green,Blue :BYTE );
-
- IMPLEMENTATION
- (***********************************************************************)
- FUNCTION MonitorType :BYTE; ASSEMBLER;
- { Determines Type of Monitor In Use. }
- ASM
- Mov AH,$1A { Function Determine Display Code }
- Mov AL,0 { AL,0 = Read Code AL,1 = Set Code }
- Int $10 { Call Dos }
- Mov AL,BL; { Move result to proper register }
- { 0 - no Display 4 - Ega Standard Color 7 - VGA MONO }
- { 1 - MDA 5 - Ega MonoChrome 8 - VGA }
- { 2 - CGA 6 - PGA }
- END;{MonitorType}
-
- PROCEDURE SetVidMode( Mode :BYTE ); ASSEMBLER;
- { Routine to set video mode }
- ASM
- Mov AH,00 { Function to set mode }
- Mov AL,Mode { Mode to change to }
- Int $10 { Call dos }
- END;{SetVidMode}
-
- PROCEDURE SetPage( Page :BYTE ); ASSEMBLER;
- { Routine to change screen pages }
- ASM
- Mov AH,$05 { Function to change pages }
- Mov AL,Page { Page to change to }
- Int $10 { Call dos }
- END;{SetPage}
-
- PROCEDURE BiosPutPix( Col,Page :BYTE; X,Y :WORD ); ASSEMBLER;
- { Routine to plot a pixel on the screen using INT 10h. }
- ASM
- Mov AH,$0C { Function to plot a pixel }
- Mov AL,Col { Color to make it }
- Mov BH,Page; { Page to write it to }
- Mov CX,X { Column to put it at }
- Mov DX,Y { Row to place it }
- Int $10 { call dos }
- END;{BiosPutPix}
-
- FUNCTION TSeng :BOOLEAN;
- { Routine to determine if Graphics card is a TSENG labs}
- VAR
- Old,New :BYTE;
- BEGIN
- Old := Port[$3CD]; { Save original card register value }
- Port[$3CD] := $55; { change it }
- New := Port[$3CD]; { read in new value }
- Port[$3CD] := Old; { restore old value }
- TSENG := ( New = $55 ); { if value same as what we sent (TRUE) }
- END;
-
- FUNCTION GetVideoMode :BYTE; ASSEMBLER;
- { Routine to determine current video mode }
- ASM
- Mov AX,$0F00 { SubFunction Return Video Info }
- Int $10 { Call Dos }
- END;{GetVideoMode}
-
- PROCEDURE Set80x30Mode;
- VAR CrtcReg:ARRAY[1..8] OF WORD;
- Offset :WORD;
- I,Data :BYTE;
- BEGIN
- CrtcReg[1]:=$0C11; {Vertical Display End (unprotect regs. 0-7)}
- CrtcReg[2]:=$0D06; {Vertical Total}
- CrtcReg[3]:=$3E07; {Overflow}
- CrtcReg[4]:=$EA10; {Vertical Retrace Start}
- CrtcReg[5]:=$8C11; {Vertical Retrace End (& protect regs. 0-7)}
- CrtcReg[6]:=$DF12; {Vertical Display Enable End}
- CrtcReg[7]:=$E715; {Start Vertical Blanking}
- CrtcReg[8]:=$0616; {End Vertical Blanking}
-
- MemW[$0040:$004C]:=8192; {Change page size in bytes}
- Mem[$0040:$0084]:=29; {Change page length}
- Offset:=MemW[$0040:$0063]; {Base of CRTRC}
- ASM
- Cli {Clear Interrupts}
- END;
-
- FOR I:=1 TO 8 DO
- PortW[Offset]:=CrtcReg[i]; {Load Registers}
-
- Data:=PORT[$03CC];
- Data:=Data AND $33;
- Data:=Data OR $C4;
- PORT[$03c2]:=Data;
- ASM
- Sti {Set Interrupts}
- Mov AH,12h {Select alternate printing routine}
- Mov BL,20h
- Int 10h
- END;
- END; {Of Procedure}
-
- PROCEDURE DrawBar( X1,Y1,X2,Y2 :WORD; Color :BYTE );
- { Bar drawing routine. Specifically set up for mode }
- { 13h. Much faster than the BGI one. }
- VAR
- Row :WORD;
- BEGIN
- FOR Row := Y1 TO Y2 DO
- FillChar(MEM[$A000:(320*Row)+X1],X2-X1,Color);
- END;
-
-
- PROCEDURE SetColor( Color2Set, Red, Green, Blue :BYTE );
- { Routine to Change the palette value of Color2Set. }
- BEGIN
- PORT[$3C8] := Color2Set;
- PORT[$3C9] := Red;
- PORT[$3C9] := Green;
- PORT[$3C9] := Blue;
- END;
-
- PROCEDURE GetColor( Color2Get :BYTE; VAR Red,Green,Blue :BYTE );
- { Routine to determine the Palette value of Color2Get}
- BEGIN
- PORT[$3C8] := Color2Get;
- Red := PORT[$3C9];
- Green := PORT[$3C9];
- Blue := PORT[$3C9];
- END;
-
- BEGIN
- END.